home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / xcoral / xcoral.lha / xcoral-1.72 / kill_buf.c < prev    next >
C/C++ Source or Header  |  1993-01-23  |  5KB  |  209 lines

  1. /*
  2. ** Copyright 1989, 1992 by Lionel Fournigault
  3. **
  4. ** Permission to use, copy, and distribute for non-commercial purposes,
  5. ** is hereby granted without fee, providing that the above copyright
  6. ** notice appear in all copies and that both the copyright notice and this
  7. ** permission notice appear in supporting documentation.
  8. ** The software may be modified for your own purposes, but modified versions
  9. ** may not be distributed.
  10. ** This software is provided "as is" without any expressed or implied warranty.
  11. **
  12. **
  13. */
  14.  
  15. #include <stdio.h>
  16. #ifndef apollo
  17. #include <malloc.h>
  18. #endif
  19. #include <string.h>
  20. #include <X11/Xlib.h>
  21.  
  22. #include "text.h"
  23. #include "flist.h"
  24.  
  25. #define KB_SIZE_BUF 256
  26. #define KB_SIZE 20
  27.  
  28. typedef struct {
  29.     char *p;        /* Le buffer */
  30.     unsigned int size;    /* La taille du buffer */
  31.     unsigned int s_len;    /* Longueur de s dans le buffer */
  32.     unsigned int s_lines;    /* Nb de lignes */
  33. } kb;
  34.  
  35. static kb killbuf [KB_SIZE];
  36. static void ShiftBuffers ();
  37.  
  38.  
  39. /*
  40. **    Function name : InitKillBuf
  41. **
  42. **    Description : Creation de la pile des buffers pour ranger ce
  43. **        qui a ete efface.
  44. **    Input : 
  45. **    Ouput :
  46. */
  47. void InitKillBuf ()
  48. {
  49.     register int i;
  50.  
  51.     for ( i=0; i < KB_SIZE; i++ ) {
  52.         killbuf [i].p = (char *) malloc ( KB_SIZE_BUF );
  53.         killbuf [i].size = KB_SIZE_BUF;
  54.         killbuf [i].s_len = 0;
  55.         killbuf [i].s_lines = 0;
  56.        }
  57. }
  58.  
  59.  
  60. /*
  61. **    Function name : StoreInKillBuf
  62. **
  63. **    Description : Met la chaine s de longeur n et
  64. **        contenant n lignes dans la pile.
  65. **
  66. **    Input : La chaine, sa longueur, le nb de lignes.
  67. **    Ouput :
  68. */
  69. void StoreInKillBuf ( s, len, n )
  70.     register char *s;
  71.     register int len;
  72.     register int n;
  73. {
  74.     /*
  75.      * Pas les lignes vides
  76.      */
  77.     if ( (len == 1) && (*s == '\n' ))
  78.         return;
  79.  
  80.     /*
  81.      * Si ya deja quelque chose, on decale.
  82.      */
  83.     if ( killbuf [0].s_len != 0 ) 
  84.         ShiftBuffers ();
  85.  
  86.     /*
  87.      * Si ya pas assez de place, on change
  88.      * le pointeur courant.
  89.      */
  90.     if ( len > killbuf [0].size ) { 
  91.               if ( killbuf [0].p != 0 )
  92.             (void) free ( killbuf [0].p );
  93.         killbuf [0].p = (char *) malloc ( (unsigned) len + 1 );
  94.         killbuf [0].size = len + 1;
  95.     }
  96.  
  97.     /*
  98.      * Copie et mis a jour des infos.
  99.      */       
  100.     (void) strncpy ( killbuf [0].p, s, len ); 
  101.     killbuf [0].s_len = len;
  102.     killbuf [0].s_lines = n;
  103.  
  104. #ifdef DEBUG
  105.        (void) fprintf ( stderr, "Store len = %d size = %d lines = %d\n", 
  106.            killbuf [0].s_len, killbuf [0].size, killbuf [0].s_lines );
  107. #endif
  108. }
  109.  
  110.  
  111. /*
  112. **    Function name : ShiftBuffers
  113. **
  114. **    Description :  On decale les buffers pour liberer le premier.
  115. **        Le buffer no 20 est perdu.
  116. **    Input : 
  117. **    Ouput :
  118. */
  119. static void ShiftBuffers ()
  120. {
  121.       register int i;
  122.  
  123.       for ( i=KB_SIZE-1; i > 0; i-- ) { /* On commence par le dernier */
  124.  
  125.          if ( killbuf [i-1].size > killbuf [i].size ) {
  126.                  if ( killbuf [i].p != 0 )
  127.             free ( killbuf [i].p );
  128.         killbuf [i].p = (char *) malloc ( killbuf [i-1].size );
  129.          }
  130.  
  131.              (void) strncpy ( killbuf [i].p, killbuf [i-1].p, (int) killbuf [i-1].s_len );
  132.  
  133.          killbuf [i].size = killbuf [i-1].size;
  134.          killbuf [i].s_len = killbuf [i-1].s_len;
  135.          killbuf [i].s_lines = killbuf [i-1].s_lines;
  136.  
  137. #ifdef DEBUG
  138.          fprintf ( stderr, "Store i = %d p = %d len = %d\n",
  139.               i, killbuf [i].p, killbuf [i].s_len );
  140. #endif
  141.       }
  142. }
  143.  
  144.  
  145. /*
  146. **    Function name : RestoreKillBuff
  147. **
  148. **    Description : Restore le la chaine contenu dans
  149. **        le buffer i.
  150. **
  151. **    Input : Le numero dans la pile, longueur, et nb lignes.
  152. **    Ouput : La chaine.
  153. */
  154. char *RestoreKillBuf ( i, len, dn )
  155. register int i;
  156. register int *len; /* Return */
  157. register int *dn;  /* Return */
  158. {
  159.        if ( (i < 0) || (i > (KB_SIZE-1)) || (killbuf [i].s_len == 0))
  160.               return 0;
  161.  
  162.        *len = killbuf [i].s_len;
  163.        *dn =  killbuf [i].s_lines;
  164.        return ( (char *) killbuf [i].p );
  165. }
  166.  
  167.  
  168. /*
  169. **    Function name : LoadKillBuffer
  170. **
  171. **    Description : Charge le contenu de la pile dans
  172. **        un buffer. ( uniquement les debuts de lignes ).
  173. **
  174. **    Input : Le buffer
  175. **    Ouput :
  176. */
  177. void LoadKillBuffer ( buf )
  178. Buf *buf;
  179. {
  180.     register int i, len;
  181.     char tmp[8];
  182.        register char *p;
  183.  
  184. #define MAX_LEN    30
  185.  
  186.        for ( i=0; i < KB_SIZE; i++ ) {
  187.               bzero ( tmp, 8 );
  188.               (void) sprintf ( tmp, "%d  ", i + 1 );
  189.         InsertNchar ( buf, tmp, strlen(tmp) );
  190.         if ( killbuf [i].s_lines < 2 ) {
  191.             if ( (len = killbuf [i].s_len) > MAX_LEN )
  192.                 len = MAX_LEN;
  193.                 }
  194.               else {
  195.                   p = killbuf [i].p;
  196.                   while ( *p != '\n' ) p++;
  197.                   len = p - killbuf [i].p;
  198.             if ( len > MAX_LEN )
  199.                 len = MAX_LEN;
  200.         } 
  201.         if ( len != 0 )
  202.             InsertNchar ( buf, killbuf [i].p, len );
  203.  
  204.         InsertNchar ( buf, " ...\n", 5 ); 
  205.     }
  206. }
  207.  
  208.  
  209.